package com.lzk.controller;

import com.lzk.model.Result;
import com.lzk.pojo.WXPayTransactionLog;
import com.lzk.service.OrderService;
import com.lzk.service.WeixinPayService;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Linzk on 2020/12
 */

@RestController
@RequestMapping("/weixin_pay")
public class WeixinPayController {

    private WeixinPayService weixinPayService;

    private OrderService orderService;

    /**
     * 1.用户先去下订单，若使用的是微信支付，
     * 则下完订单后会在缓存中生成一条微信支付的记录。
     * 1.1 之后：我们获取当前用户的UserId去缓存中获取，存在此微信支付的交易订单后，我们
     * 获取此微信支付的out_trade_no(商户订单号) + totalFee订单金额-->以此创建一个URL，让拿到这个URL生成一个
     * 微信支付的二维码，完成支付！
     *
     * @return
     */

    @ApiOperation(value = "微信支付二维码URL生成")
    @RequestMapping("/createNative")
    public Map createNative() {
        //1. 先获取当前登录用户，这里暂时UserId = 1
        String userId = "1";
        //2.从缓存中提取微信支付日志
        WXPayTransactionLog wxTransactionLog = orderService.searchPayLogFromRedis(userId);
        if (wxTransactionLog!=null) {
            String outTradeNo = wxTransactionLog.getOutTradeNo();//商户订单号
            Long totalFee = wxTransactionLog.getTotalFee(); //订单支付金额
            //3.调用微信支付接口
            return weixinPayService.createNative(outTradeNo,totalFee+"");

        }else {
            return new HashMap();
        }



    }

    /**
     * 1.调用微信查询API的接口，获取支付结果
     * 2. Controller这里根据获取到的结果，判断Success或failed
     *
     * String out_trade_no --->这个订单号由前端传进来，因此在上面的createNative()中
     * 我们已经获取到一个URL，里面携带了订单号(out_trade_no)。
     */
    @RequestMapping("/queryPayStatus")
    public Result queryPayStatus(String out_trade_no) {
        Result result = null;
        //定义x，显示循环查询时间规定在5分钟，5分钟之内未支付就退出循环查询
        int x=0;
        /**
         * 下面做一个无限循环，去不断查询支付的最新状态
         */
        while(true) {
            Map<String,String> map = weixinPayService.queryPaySattus(out_trade_no);
            /**
             * 根据查询的结果，判断支付success或failed
             * -->null,返回支付失败，跳出循环
             * -->trade_state == SUCCESS,返回支付成功，跳出循环
             *
             */
            if (map == null) {
                result = new Result(false,"支付失败");
                break;
            }
            //支付成功
            if (map.get("trade_state").equals("SUCCESS")) {
                result = new Result(true,"支付成功");
                //当支付成功，调用修改状态方法
                orderService.updateOrderStatus(out_trade_no,map.get("transaction_id"));
                break;
            }
            /**
             * 不可能让他一直循环去查询支付结果，这里让他停一下再去查
             * -->即：每停歇3秒钟，调用查询
             */
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //5分钟，差不多执行100次的while的循环的情况下用户未支付，退出循环！
            x++;
            if (x>=100){
                result = new Result(false,"二维码超时");
                break;
            }

        }
        return result;
    }
}
